package io.qifan.desktop.client.registry;

import io.qifan.desktop.client.views.BaseController;
import io.qifan.desktop.common.exception.SystemException;
import javafx.fxml.FXMLLoader;
import javafx.util.Callback;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.net.URL;

@Component
@Slf4j
public class ViewPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // 每一个view都绑定一个controller。view指的是在resource下的那些fxml。
        // 所以先扫描views包下面的controller，例如 IndexController-> index.fxml。
        if (bean instanceof BaseController) {
            // 从classPath中查找Controller对应的view
            URL url = bean.getClass().getResource(bean
                    .getClass()
                    .getSimpleName()
                    .replace("Controller", ".fxml").toLowerCase());
            log.info(bean.getClass().getResource("").getPath());
            log.info("fxml路径：{}", url.getPath());
            // 使用JavaFx的 fxmlLoad来初始化ControllerBean。
            FXMLLoader fxmlLoader = new FXMLLoader(url);
            // 这边用的是Spring的bean，保证全局只有一个Controller对象。
            fxmlLoader.setControllerFactory(param -> bean);
            try {
                // 这边开始读取fxml，然后初始化和ControllerBean里面的一些属性
                Object load = fxmlLoader.load();
                // if已经判断过了，可以直接强转类型。
                BaseController controller = (BaseController) bean;
                ViewRegistry.put(controller.getClass(), load);
            } catch (IOException e) {

                throw new SystemException(e.getMessage());
            }
        }
        return bean;
    }
}
